1時間プログラミング 011 JSONをCSVに変換する
概要
JSONをCSVに変換する
所要時間: 1時間
使い方
code:samples/liz-bluebird.json
[
{
"氏名": "鎧塚みぞれ",
"担当楽器": "オーボエ"
},
{
"氏名": "傘木希美",
"担当楽器": "フルート"
}
]
code:terminal
$ cat samples/liz-bluebird.json | deno run
氏名,担当楽器
鎧塚みぞれ,オーボエ
傘木希美,フルート
実装
TS(Deno)で作成する
標準入力から文字列を読み込む
JSONからCSV用のデータに変換する
ヘッダーを指定する場合は、stringify(data, { headers: true, columns }) のようにオプションを指定する
dataにはCSV行の一覧を指定する
data: DataItem[]
columnsにはヘッダー列の一覧を指定する
columns: Column[]
各ヘッダー列には「列名 + プロパティ」or「プロパティ」を指定する
プロパティは、dataで指定したCSVデータのフィールドにアクセスするためのkeyという位置付け
「プロパティ」のみを指定した場合、列名はプロパティと同じになる
CSVのフィールドはdata[idx][<プロパティ>]で取得されるイメージ
code:ts
function jsonToCsv(json: any): string {
// check type
if (!Array.isArray(json)) {
throw new Error("JSON is not array");
}
if (!json.every(isPlainObject)) {
throw new Error("JSON item is not object");
}
// get keys
const keySet = new Set<string>();
json.forEach((obj) => {
Object.keys(obj).forEach((k) => keySet.add(k));
});
const columns = Array.from(keySet);
// convert
const data = json.map((obj) => {
return columns.reduce((row, k) => {
return { ...row, k: objk ?? "" }; }, {});
});
return stringify(data, { headers: true, columns });
}
型チェックはあまり厳密に行っていない
厳密に見るなら、CSVフィールドの値は数値・文字列・真偽値・nullのみ許可すべき
感想
の挙動がよく分からず、ソースコードを読んで確認した